import java.util.ArrayList;
import java.util.Collections;

import net.canos.object.Resultado;

import org.apache.commons.lang3.RandomStringUtils;
import org.apache.commons.lang3.StringUtils;

import com.canos.util.Util;


public class SystemInfo {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		
		int numElems = 2000000;
		int tamanyoCadena = 50;
		
		Util.p("Start");
		Util.printMemoryInfo();
		Util.p("");Util.p("");
		
		// Creación de palabras aleatorias
		Util.p("Generando cadenas...");
		long pre0 = System.currentTimeMillis();
		ArrayList<String> list1 = new ArrayList<String>();
		ArrayList<String> list2 = new ArrayList<String>();
		ArrayList<Resultado> resultados = new ArrayList<Resultado>();
		
		for(int i = 0;i<numElems;i++){
			String aux1 = RandomStringUtils.randomAscii(tamanyoCadena);
		    String aux2 = RandomStringUtils.randomAscii(tamanyoCadena);		    
			list1.add(aux1);
			list2.add(aux2);
		}
		long pos0 = System.currentTimeMillis();
		Util.p("Generadas cadenas ("+(pos0-pre0)+")");
		Util.printMemoryInfo();
		Util.p("");Util.p("");
		
		
		
		// Confrontar dos cadenas
		Util.p("Enfrentando cadenas y calculando semejanza...");
		long pre1 = System.currentTimeMillis();
		for(int i =  0;i<numElems;i++){
			Double dindex1 = Math.random()*numElems;
			Integer index1 = dindex1.intValue();
			String aux1 = list1.get(index1);
			
			Double dindex2 = Math.random()*numElems;
			Integer index2 = dindex2.intValue();
			String aux2 = list2.get(index2);
			
			Integer distancia = StringUtils.getLevenshteinDistance(aux1, aux2);
			
			Resultado r = new Resultado(aux1, aux2, distancia);
			resultados.add(r);
		}
		long pos1 = System.currentTimeMillis();
		Util.p("Calculadas distancias ("+(pos1-pre1)+")");
		Util.printMemoryInfo();
		Util.p("");Util.p("");;
		
		
		long pre2 = System.currentTimeMillis();
		Collections.sort(resultados);
		long pos2 = System.currentTimeMillis();
		
		Util.p("Ordenadas cadenas ("+(pos2-pre2)+")");
		Util.printMemoryInfo();
		Util.p("");Util.p("");;
		
		Long tiempo = (pos2-pre2) + (pos1-pre1) +  (pos0-pre0);
		Util.p("Creando cadenas:"+(pos0-pre0));
		Util.p("Comparando:"+(pos1-pre1));
		Util.p("Ordenando:"+(pos2-pre2));
		Util.p("Tiempo empleado:"+tiempo+"ms");
		Util.p("");Util.p("");
		
		Util.p("RANKING  resultados:"+resultados.size());
		for(int i=0;i<3;i++){
			Util.p((i+1)+")"+resultados.get(i));
		}
		
		
		Util.p("");Util.p("");
		Util.printMemoryInfo();
		Util.p("");Util.p("");
		
		Util.p("Fuerzo un GC");
		System.gc();
		
		Util.printMemoryInfo();
		Util.p("");Util.p("");;
		
		
	}

}
